/*************************************************************************
	> File Name: oj-566_browse_stat.cpp
	> Author: Wang Bo
	> Mail: 1276106221@qq.com
	> Created Time: 2020年11月04日 星期三 22时10分05秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <queue>
using namespace std;
//需求：要存储用户名和对应的浏览记录
//利用map来存储，用户名作为key，vector<string>用来存储浏览记录
typedef map<string, vector<string>> Stat;
//每次输入是一对字符串，first是key，second是需要追加到历史里面的浏览记录
typedef pair<string, string> KV;

void insert_stat(Stat &stat, queue<string> &q, const KV &p) {
    auto it = stat.find(p.first);
    //如果输入的用户名p.first在Stat中不能找到（返回end迭代器）
    if (it == stat.end()) {
        //则新建一个Stat元素，key为p.first字符串，value为一个字符串的vector
        stat.insert(pair<string, vector<string>>(p.first, {p.second}));
        //由于最后需要按用户名出现顺序输出浏览记录，因此考虑用队列结构来存储用户名
        q.push(p.first);
    //如果输入的用户名在Stat中存在，则直接在返回的迭代器中取到vector并push_back追加浏览记录
    } else {
        (*it).second.push_back(p.second);
    }
}

int main() {
    Stat mystat;
    queue<string> namequeue;
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        KV temp;
        cin >> temp.first >> temp.second;
        insert_stat(mystat, namequeue, temp);
    }
    //按用户名先进先出顺序输出对应的Stat的value值
    while (!namequeue.empty()) {
        string cur_name = namequeue.front();
        cout << cur_name;
        auto it = mystat.find(cur_name);
        //用c++11标准的新for-loop形式，输出Stat的vector域的所有数据
        for (string web : (*it).second) {
            cout << " " << web;
        }
        cout << endl;
        //该用户的记录输出完毕，队列弹出
        namequeue.pop();
    }
    return 0;
}
